programacionfandomcom-20200214-history
Clarion: Codigo Util
En esta sección se incluyen rutinas de código que nos resultaron útiles en más de una ocasión. Modificar la posicion de un informe Este código permite modificar la posición inicial vertical y horizontal de un informe. Es útil cuando trabajamos con un formulario preimpreso o una hoja membretada y necesitamos desplazar la impresión sin necesidad de reconfigurar el programa. El punto embebido donde se ubica es After Open the Report. ! ! MODIFICAR LA POSICION DEL INFORME ! El pie de página modificarlo sólo si se usa: ! Por ejemplo se pone ahí el Nro de página o algo así. ! No es necesario cambiar los atributos de las bandas ! de detalle adicionales que se usan en el informe. !----------------------------------------------------- DesplazamientoX = getini('Parametros',| 'DesplazamientoX',,'.\prog.ini') DesplazamientoY = getini('Parametros',| 'DesplazamientoY',,'.\prog.ini') if DesplazamientoX or DesplazamientoY then SETTARGET(Report) x# = report{prop:Xpos} y# = report{prop:Ypos} x# += DesplazamientoX y# += DesplazamientoY target{prop:Xpos} = x# target{prop:Ypos} = y# settarget SETTARGET(Report,?Encabezado) x# = ?Encabezado{prop:Xpos} y# = ?Encabezado{prop:Ypos} x# += DesplazamientoX y# += DesplazamientoY ?Encabezado{prop:Xpos} = x# ?Encabezado{prop:Ypos} = y# settarget SETTARGET(Report,?PiePagina) x# = ?PiePagina{prop:Xpos} y# = ?PiePagina{prop:Ypos} x# += DesplazamientoX y# += DesplazamientoY ?PiePagina{prop:Xpos} = x# ?PiePagina{prop:Ypos} = y# SETTARGET end Generar un informe a partir de una cola en memoria (Sin pasar por el template) Se puede definir en el módulo en la parte de DATA el reporte necesario y mandarlo a imprimir. En DATA SECTION WMFQue QUEUE PageImage STRING(64) END ReportRunDate LONG ReportRunTime LONG !!> Report (portrait) Report REPORT,AT(1000,2000,6000,7000),THOUS,PRE(RPT),FONT('Arial',10) HEADER,AT(1000,1000,6000,1000) END Detail DETAIL END FOOTER,AT(1000,9000,6000,1000) END FORM,AT(1000,1000,6000,9000) END END Luego, en el botón que imprime, poner el siguiente código: ReportRunDate = today() ReportRunDate = today() ReportRunTime = clock() OPEN(Report) LOOP x# = 1 to records(ColaError) get(ColaError,x#) PRINT(rpt:DetalleUno) END ENDPAGE(Report) ReportPreview(WMFQue) <- a mí me marca error aquí y nunca me abre el reporte ? hampom@hotmail.com, ayuda por favor IF GlobalResponse = RequestCompleted Report{PROP:FlushPreview} = True END CLOSE(Report) FREE(WMFQue) Este proceso usa el Print Preview de Clarion para visualizar el informe, por consiguiente, la apariencia es totalmente normal para el usuario Proceso BATCH que funcione sincronizado con el TIMER de la ventana. En un proceso BATCH hecho a mano se puede operar en forma similar al report o al proccess, para eso hay que definir una pantalla que tenga el atributo TIMER (un valor de 1 es suficiente). El código fuente quedaría de la siguiente manera: open(PantaTrabaja) Accept case event() of event:openwindow Display() ! Abrir pantalla, Abrir archivos, hacer el set ! Inicial of event:timer ?Mensaje{prop:text} = 'Procesando...' display(?Mensaje) loop 2 times next(archivo) if errorcode() then FinArchivo = true Break end ! HACER AQU�? ALGÚN PROCESO.. end of event:closewindow Setcursor() Close(PantaTrabaja) Break End!case case field() of ?BotonCancelar if event() = event:accepted then message('Proceso cancelado por el usuario.') post(event:closewindow) end End end!accept Drop Combo a mano, con opción a todos y recuerdo de último elegido En muchos de mis informes, cuando pido parámetros asumo lo siguiente, por ejemplo: Si el código de cliente es igual a 0 (cero) se imprimen todos los clientes, sino, se imprime uno solo. Este código permite armar lo mismo con un DropCombo, agregando la opción TODOS LOS XXXX (código Cero). 1. Definir una cola con la siguiente estructura ( por ejemplo ): Cola QUEUE,PRE(col) descri STRING(20) codigo SHORT END 2. Definir una variable local llamada por ejemplo Combo1 STRING(20) 3. En la pantalla definir una drop combo a mano, en el campo FROM poner el nombre de la COLA, y en el USE poner Combo1 ( no poner ?Combo1 ) 4. Cargar la cola según corresponda después de abrir archivos, poniendo como último dato el código 0 y el texto 'TODOS LOS REGISTROS' y hacer un ADD(Cola,1) para que quede al principio. 5. Definir una variable global ( o local estática) que va a guardar el resultado elegido: Glo:codigo short 6. En el evento open window, ANTES de abrir la ventana va el siguiente código loop x# = 1 to records(Cola) get(Cola,x#) if col:codigo = glo:codigo then break. end Combo1 = col:descri ?Combo1{prop:selected} = x# 7. Al hacer esto, el combo se abre posicionado en el último elemento elegido o en TODOS LOS REGISTROS si es la primera vez. En un report, poner los totales en otra página En algún informe, se puede solicitar como parámetro la opción de imprimir los totales correspondientes en una página nueva. Para ello, después de abrir el report: !---¿TOTALES EN UNA P�?GINA NUEVA?--- if glo:totpag then settarget(report) ?TituloTotalCategoria{prop:pagebefore} = 1 end En un report, cambiar el color de un campo según alguna condición Si durante la impresión de un informe se desea cambiar algún atributo (tal como el color) de un campo puede hacer lo siguiente (antes de imprimir el detalle): if cl:impotota <> cl:totacalc settarget(report) ?ARC:importe{PROP:FONTCOLOR} = COLOR:RED settarget(ProgressWindow) else settarget(report) ?ARC:importe{PROP:FONTCOLOR} = COLOR:NONE settarget(ProgressWindow) end print(rpt:Detalle) ! Imprimir la línea de detalle